package middleware

import (
	"fmt"
	"github.com/go-pay/gopay/pkg/jwt"
	"time"
)

// 密钥用于签名和验证 JWT
var jwtKey = []byte("8d969eef6ecad3c29a3a629280e686cf")

type Claims struct {
	Id string `json:"id"`
	jwt.StandardClaims
}

// 获取Token
func (c *Claims) GenerateJWT(id string) (string, error) {
	// 设置过期时间为 24 小时后
	expirationTime := time.Now().Add(24 * time.Hour)
	claims := &Claims{
		Id: id,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expirationTime.Unix(),
		},
	}
	// 创建一个新的 JWT 对象，使用 HMAC SHA256 算法签名
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 使用密钥签名并返回生成的 JWT 字符串
	return token.SignedString(jwtKey)
}

// 验证 JWT 函数
func (c *Claims) ValidateJWT(tokenString string) (*Claims, error) {
	// 解析 token
	claims := &Claims{}
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法是否为 HMAC SHA256
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("签名方法错误: %v", token.Method.Alg())
		}
		return jwtKey, nil
	})
	if err != nil {
		return nil, err
	}
	// 验证 token 是否有效
	if !token.Valid {
		return nil, fmt.Errorf("token无效")
	}

	return claims, nil
}
